// 1-2. 命名空间-using 指令
/**
 * C++ 命名空间
 * 假设这样一种情况，当一个班上有两个名叫 Zara 的学生时，为了明确区分它们，我们在使用名字之外，不得不使用一些额外的信息，比如他们的家庭住址，或者他们父母的名字等等。

 * 同样的情况也出现在 C++ 应用程序中。例如，您可能会写一个名为 xyz() 的函数，在另一个可用的库中也存在一个相同的函数 xyz()。这样，编译器就无法判断您所使用的是哪一个 xyz() 函数。

 * 因此，引入了命名空间这个概念，专门用于解决上面的问题，它可作为附加信息来区分不同库中相同名称的函数、类、变量等。使用了命名空间即定义了上下文。本质上，命名空间就是定义了一个范围。

 * 我们举一个计算机系统中的例子，一个文件夹(目录)中可以包含多个文件夹，每个文件夹中不能有相同的文件名，但不同文件夹中的文件可以重名。

                            文件夹A
                          ↙       ↘
                    文件夹B          文件夹C
                    ↙ ↘             ↙   ↘
            runoob-2   runoob      runoob   runoob-3
            .txt文件   .txt文件    .txt文件   .txt文件
                       |            |
                       —不同文件夹可以—
                        有相同名字的文件

 *-----------------------------------------
 * using 指令
 * 您可以使用 using namespace 指令，这样在使用命名空间时就可以不用在前面加上命名空间的名称。这个指令会告诉编译器，后续的代码将使用指定的命名空间中的名称
 * 
 * using 指令也可以用来指定命名空间中的特定项目。例如，如果您只打算使用 std 命名空间中的 cout 部分，您可以使用如下的语句：

          using std::cout;
 
 * 
 * 随后的代码中，在使用 cout 时就可以不用加上命名空间名称作为前缀，但是 std 命名空间中的其他项目仍然需要加上命名空间名称作为前缀，如下所示：
 * 
 * 
          #include <iostream>
          using std::cout;
          
          int main ()
          {
          
            cout << "std::endl is used with std!" << std::endl;
            
            return 0;
          }
  
  * 当上面的代码被编译和执行时，它会产生下列结果：

         std::endl is used with std!

  * using 指令引入的名称遵循正常的**范围规则**。名称从使用 using 指令开始是可见的，直到该范围结束。此时，在范围以外定义的**同名实体**是隐藏的。
*/

#include <iostream>
#define __mark 2

namespace first_space
{
  int a = 1;
  void func()
  {
    std::cout << "inside first space" << std::endl;
  }
  int a1 = 1;
}
namespace second_space
{
  int a = 2;
  void func()
  {
    std::cout << "inside second space" << std::endl;
  }
  int a2 = 2;
}

#if 1 == __mark
int main(void)
{
  using namespace first_space;
  // func();
  // std::cout << "a1 : " << a1 << std::endl;
  using namespace second_space;
  // func();

  // std::cout << "a : " << a << std::endl;
  std::cout << "a1 : " << a1 << std::endl;
  std::cout << "a2 : " << a2 << std::endl;
  printf("-----------------end----------------\n");
  return 0;
}

#elif 2 == __mark
int main(void)
{
  using first_space::func;
  func();
  // std::cout << " a1 : " << a1 << std::endl;
  using second_space::func;
  // func(); // 多个
  printf("-----------------end----------------\n");
  return 0;
}
#endif